package ejb.com.bbva.cbm.util;

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;



public abstract class SQLUtil {
	/*
	public static Map<String, Object> actualizarDatos(Integer connectionId, String sql, Map<String, Object> parametros) {
		Map<String, Object> registro = new HashMap<String, Object>();
		
		ResultSet rst = null;
		Connection cnn = null;
		PreparedStatement stm = null;
		
		try {
			cnn = MySqlDBConn.getConnection(connectionId);
			stm = cnn.prepareStatement(sql);
			asignarParametros(stm, parametros);
			
			registro.put("resultado", stm.executeUpdate());
		} catch (Exception e) {
			e.printStackTrace();logger.error(e);
		} finally {
			MySqlDBConn.close(rst, stm, cnn);
		}
		
		return registro;
	}
	
	public static Map<String, Object> obtenerElementoMapeado(Integer connectionId, String sql) {
		return obtenerElementoMapeado(connectionId, sql, null);
	}
	public static Map<String, Object> obtenerElementoMapeado(Integer connectionId, String sql, Map<String, Object> parametros) {
		Map<String, Object> registro = new HashMap<String, Object>();
		
		ResultSet rst = null;
		Connection cnn = null;
		PreparedStatement stm = null;
		
		try {
			cnn = MySqlDBConn.getConnection(connectionId);
			stm = cnn.prepareStatement(sql);
			asignarParametros(stm, parametros);
			rst = stm.executeQuery();
			if (rst.next()) {				
				ResultSetMetaData rsmd = rst.getMetaData();

				for (int i = 1; i <= rsmd.getColumnCount(); i++) {
					registro.put(rsmd.getColumnName(i), rst.getString(i));
				}
			}
		} catch (Exception e) {
			e.printStackTrace();logger.error(e);
		} finally {
			MySqlDBConn.close(rst, stm, cnn);
		}
		
		return registro;
	}
	public static List<Opcion> obtenerListadoOpciones(Integer connectionId, String sql) {
		return obtenerListadoOpciones(connectionId, sql, null);
	}
	public static List<Opcion> obtenerListadoOpciones(Integer connectionId, String sql, Map<String, Object> parametros) {
		List<Opcion> lista = new ArrayList<Opcion>();
		
		ResultSet rst = null;
		Connection cnn = null;
		PreparedStatement stm = null;
		
		try {
			cnn = MySqlDBConn.getConnection(connectionId);
			stm = cnn.prepareStatement(sql);
			asignarParametros(stm, parametros);
			rst = stm.executeQuery();
			while (rst.next()) {
				lista.add(new Opcion(rst.getString(1), rst.getString(2)));
			}
		} catch (Exception e) {
			e.printStackTrace();logger.error(e);
		} finally {
			MySqlDBConn.close(rst, stm, cnn);
		}
		
		return lista;
	}
	
	public static List<Map<String, Object>> obtenerListadoMapeado(Integer connectionId, String sql) {
		return obtenerListadoMapeado(connectionId, sql, null);
	}
	public static List<Map<String, Object>> obtenerListadoMapeado(Integer connectionId, String sql, Map<String, Object> parametros) {
		List<Map<String, Object>> lista = new ArrayList<Map<String, Object>>();
		
		ResultSet rst = null;
		Connection cnn = null;
		PreparedStatement stm = null;
		
		try {
			cnn = MySqlDBConn.getConnection(connectionId);
			stm = cnn.prepareStatement(sql);
			asignarParametros(stm, parametros);
			rst = stm.executeQuery();
			
			ResultSetMetaData rsmd = rst.getMetaData();
			String[] nombreColumnas = new String[rsmd.getColumnCount()];
			
			for (int i = 1; i <= nombreColumnas.length; i++) {
				nombreColumnas[i-1] = rsmd.getColumnName(i);
			}
			
			while (rst.next()) {
				Map<String, Object> registro = new HashMap<String, Object>();

				for (int i = 1; i <= nombreColumnas.length; i++) {
					registro.put(nombreColumnas[i-1], rst.getString(i));
				}
				
				lista.add(registro);
			}
		} catch (Exception e) {
			e.printStackTrace();logger.error(e);
		} finally {
			MySqlDBConn.close(rst, stm, cnn);
		}
		
		return lista;
	}
	
	public static Listado obtenerListadoGenerico(Integer connectionId, String sql) {
		return obtenerListadoGenerico(connectionId, sql, null);
	}
	public static Listado obtenerListadoGenerico(Integer connectionId, String sql, Map<String, Object> parametros) {
		Listado listado = new Listado();		
		ResultSet rst = null;
		Connection cnn = null;
		PreparedStatement stm = null;		
		try {
			cnn = MySqlDBConn.getConnection(connectionId);
			stm = cnn.prepareStatement(sql);
			asignarParametros(stm, parametros);
			rst = stm.executeQuery();			
			ResultSetMetaData rsmd = rst.getMetaData();
			ArrayList<String> columnas = new ArrayList<String>();			
			for (int i = 1; i <= rsmd.getColumnCount(); i++) {
				columnas.add(rsmd.getColumnName(i));
			}			
			listado.setColumnas(columnas);			
			while (rst.next()) {
				Map<String, String> registro = new HashMap<String, String>();
				for (int i = 1; i <= columnas.size(); i++) {
					registro.put(columnas.get(i-1), rst.getString(i));
				}				
				listado.getRegistros().add(registro);
			}
		} catch (Exception e) {
			e.printStackTrace();logger.error(e);
		} finally {
			MySqlDBConn.close(rst, stm, cnn);
		}
		
		return listado;
	}*/

	public static Listado obtenerListadoGenerico(ResultSet rst) throws Exception {
		Listado listado = new Listado();	
		
		ResultSetMetaData rsmd = rst.getMetaData();
		ArrayList<String> columnas = new ArrayList<String>();			
		for (int i = 1; i <= rsmd.getColumnCount(); i++) {
			if(!rsmd.getColumnName(i).equals("ROW_") &&	!rsmd.getColumnName(i).equals("FECHA_AUX")){
					columnas.add(rsmd.getColumnName(i));
			}
		}			
		listado.setColumnas(columnas);			
		while (rst.next()) {
			Map<String, String> registro = new HashMap<String, String>();
			for (int i = 1; i <= columnas.size(); i++) {
				registro.put(columnas.get(i-1), rst.getString(columnas.get(i-1)));
			}				
			listado.getRegistros().add(registro);
		}
		return listado;
	}
	public static ArrayList<Object[]> obtenerDataGenerico(ResultSet rst) throws Exception {
			
		
		ResultSetMetaData rsmd = rst.getMetaData();
		ArrayList<String> columnas = new ArrayList<String>();
		ArrayList<Object[]> data = new ArrayList<Object[]>();
		
		for (int i = 1; i <= rsmd.getColumnCount(); i++) {
			if(!rsmd.getColumnName(i).equals("ROW_")&&	!rsmd.getColumnName(i).equals("FECHA_AUX"))
				columnas.add(rsmd.getColumnName(i));
		}			
					
		while (rst.next()) {
			Object[] row=new Object[columnas.size()];
			for (int i = 0; i <columnas.size(); i++) {
				row[i]=rst.getString(columnas.get(i));
			}				
			data.add(row);
		}
		return data;
	}
	public static ArrayList<HashMap<String, Object>> obtenerDataGenericoHashMap(ResultSet rst) throws Exception {
			
		
		ResultSetMetaData rsmd = rst.getMetaData();
		ArrayList<String> columnas = new ArrayList<String>();
		ArrayList<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>();
		
		for (int i = 1; i <= rsmd.getColumnCount(); i++) {
			if(!rsmd.getColumnName(i).equals("ROW_")&&	!rsmd.getColumnName(i).equals("FECHA_AUX"))
				columnas.add(rsmd.getColumnName(i));
		}			
					
		while (rst.next()) {
			HashMap<String, Object> row=new HashMap<String, Object>();
			for (int i = 0; i <columnas.size(); i++) {
				row.put(columnas.get(i), rst.getString(columnas.get(i)));				
			}				
			data.add(row);
		}
		return data;
	}
	public static HashMap<String, Object> obtenerData(ResultSet rst) throws Exception {
			
		ResultSetMetaData rsmd = rst.getMetaData();
		ArrayList<String> columnas = new ArrayList<String>();			
		for (int i = 1; i <= rsmd.getColumnCount(); i++) {
			if(!rsmd.getColumnName(i).equals("ROW_")&&	!rsmd.getColumnName(i).equals("FECHA_AUX"))
				columnas.add(rsmd.getColumnName(i));
		}			
		HashMap<String, Object> registro = new HashMap<String, Object>();		
		while (rst.next()) {			
			for (int i = 1; i <= columnas.size(); i++) {
				registro.put(columnas.get(i-1), rst.getString(columnas.get(i-1)));
			}				
		}
		return registro;
	}
	
	
	/*
	private static void asignarParametros(PreparedStatement stm, Map<String, Object> parametros) throws Exception {
		if(parametros != null) {
			Iterator iterator = parametros.keySet().iterator();
			int indice = 1;
			while (iterator.hasNext()) {
				Object parametro = (Object) iterator.next();
				stm.setObject(indice, parametros.get(parametro));
				indice++;
			}
		}
	}*/
}
